package com.docchatlink.controller;

import com.docchatlink.dto.ResponseMsg;
import com.docchatlink.iflytek2.WebSocketServer2;
import com.docchatlink.iflytek2.client.IflytekDocV2Client;
import com.docchatlink.iflytek2.vo.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;

/**
 * 星火知识库V2.0接口
 *
 * @author Mr.piggy
 * @since 2024/3/27
 */
@RequestMapping("/chat2")
@RestController
public class Chat2Controller {

    @Resource
    private IflytekDocV2Client iflytekDocV2Client;

    @Resource
    private WebSocketServer2 webSocketServer2;

    /**
     * 文件上传
     * 上传知识库文档数据，目前支持word、pdf、md、txt格式，单文件大小不超过20MB，不超过100W字符。
     * POST，multipart/form-data
     *
     * @param file
     * @param fileUploadParam FileUploadParam
     */
    @PostMapping("/upload")
    public ResponseMsg fileUpload(MultipartFile file, FileUploadParam fileUploadParam) throws IOException {
        return iflytekDocV2Client.fileUpload(file,fileUploadParam);
    }


    /**
     * 文档切分
     * 根据切分符对文档进行切分，上传文件之后会做一次切分，若切分效果不满意可调用此方法重新切分。
     * POST，application/json
     *
     * @param fileSplitParam FileSplitParam
     */
    @PostMapping("/fileSplit")
    public ResponseMsg fileSplit(@RequestBody FileSplitParam fileSplitParam) {
        return iflytekDocV2Client.fileSplit(fileSplitParam);
    }

    /**
     * 文档向量化
     * 对文档切分的文本块进行向量化操作（embedding），对于文件状态处于splited的文件，可以调用该方法进行向量处理。只有向量化之后的文件才可以发起问答。
     * POST，application/form-data
     *
     * @param fileIds 上传的文件id列表，多个文档id用英文逗号分割
     */
    @PostMapping("/fileEmbedding")
    public ResponseMsg fileEmbedding(@RequestParam(required = false, value = "fileIds") String fileIds) {
        return iflytekDocV2Client.fileEmbedding(fileIds);
    }

    /**
     * 文档状态查询
     * 查询文件状态，文件从上传到可问答，
     * 经历的状态如下（按顺序）：uploaded-已上传，texted-已文本化，ocring-对文档OCR识别中，spliting-切分中，splited-文本已切分，vectoring-向量中，vectored-已向量化（该状态时可问答），failed-失败。
     * GET，application/form-data
     *
     * @param fileIds 上传的文件id列表，多个文档id用英文逗号分割
     */
    @GetMapping("/fileStatus")
    public ResponseMsg fileStatus(@RequestParam(required = false, value = "fileIds") String fileIds) {
        return iflytekDocV2Client.fileStatus(fileIds);
    }

    /**
     * 文档内容相似度检索
     * 根据输入的文本，检索拆分后的相关原始文本块。
     * POST，application/json
     *
     * @param param VectorSearchParam
     */
    @PostMapping("/vectorSearch")
    public ResponseMsg vectorSearch(@RequestBody VectorSearchParam param) {
        return iflytekDocV2Client.vectorSearch(param);
    }

    /**
     * 文档分块内容获取
     * 获取文件分块内容
     * GET，application/form-data
     *
     * @param fileId 上传的文件id
     */
    @GetMapping("/fileChunks")
    public ResponseMsg fileChunks(@RequestParam(required = false, value = "fileId") String fileId) {
        return iflytekDocV2Client.fileChunks(fileId);
    }

    /**
     * 文档总结查询
     * 获取文档总结内容
     * POST，application/form-data
     *
     * @param fileId 上传的文件id
     */
    @PostMapping("/fileSummaryQuery")
    public ResponseMsg fileSummaryQuery(@RequestParam(required = false, value = "fileId") String fileId) {
        return iflytekDocV2Client.fileSummaryQuery(fileId);
    }

    /**
     * 文档总结发起
     * 发起文档内容概要总结。
     * 只有 splited、vectoring、vectored 状态的文档才可以发起总结。文档状态可参考【1.文件管理 - 文档状态查询】
     * POST，application/form-data
     *
     * @param fileId 上传的文件id
     */
    @PostMapping("/fileSummaryStart")
    public ResponseMsg fileSummaryStart(@RequestParam(required = false, value = "fileId") String fileId) {
        return iflytekDocV2Client.fileSummaryStart(fileId);
    }

    /**
     * 文档详情
     * 查询文件详情。
     * POST，application/form-data
     *
     * @param fileId 上传的文件id
     */
    @PostMapping("/fileInfo")
    public ResponseMsg fileInfo(@RequestParam(required = false, value = "fileId") String fileId) {
        return iflytekDocV2Client.fileInfo(fileId);
    }

    /**
     * 文档列表
     * 查询appId下的文件列表
     * POST，application/json
     *
     * @param fileListParam FileListParam
     */
    @PostMapping("/fileList")
    public ResponseMsg fileList(@RequestBody FileListParam fileListParam) {
        return iflytekDocV2Client.fileList(fileListParam);
    }

    /**
     * 文档删除
     * 删除文档，该操作会删除文件向量等相关信息。
     * POST，application/form-data
     *
     * @param fileIds 上传的文件id列表，多个文档id用英文逗号分割
     */
    @PostMapping("/fileDel")
    public ResponseMsg fileDel(@RequestParam(required = false, value = "fileIds") String fileIds) {
        return iflytekDocV2Client.fileDel(fileIds);
    }

    /**
     * ########知识库管理模块相关接口 #########
     */
    /**
     * 知识库创建
     * 创建一个新的知识库。
     * POST，application/json
     *
     * @param repoCreateParam RepoCreateParam 创建知识库的请求体
     */
    @PostMapping("/repoCreate")
    public ResponseMsg repoCreate(@RequestBody RepoCreateParam repoCreateParam) {
        return iflytekDocV2Client.repoCreate(repoCreateParam);
    }

    /**
     * 添加文件
     * 向知识库中添加文件，每次操作最多可添加20个文件进知识库，文件较多时，需要分多次添加。且同一个文件最多可存在于10个不同知识库。
     * 注：仅文档状态为vectored的文件才可以进行问答，文档状态可参考【1.文件管理 - 文档状态查询】
     * POST，application/json
     *
     * @param repoFileParam RepoFileParam
     */
    @PostMapping("/repoFileAdd")
    public ResponseMsg repoFileAdd(@RequestBody RepoFileParam repoFileParam) {
        return iflytekDocV2Client.repoFileAdd(repoFileParam);
    }

    /**
     * 移除文件
     * 从知识库中移除文件，一次最多操作20个文件。
     * POST，application/json
     *
     * @param repoFileParam RepoFileParam
     */
    @PostMapping("/repoFileRemove")
    public ResponseMsg repoFileRemove(@RequestBody RepoFileParam repoFileParam) {
        return iflytekDocV2Client.repoFileRemove(repoFileParam);
    }

    /**
     * 知识库列表
     * 查询app下知识库列表
     * POST，application/json
     *
     * @param repoListParam RepoListParam
     */
    @PostMapping("/repoList")
    public ResponseMsg repoList(@RequestBody RepoListParam repoListParam) {
        return iflytekDocV2Client.repoList(repoListParam);
    }

    /**
     * 知识库详情
     * 查询知识库详情
     * POST，application/form-data
     *
     * @param repoId 知识库ID
     */
    @PostMapping("/repoInfo")
    public ResponseMsg repoInfo(@RequestParam(required = false, value = "repoId") String repoId) {
        return iflytekDocV2Client.repoInfo(repoId);
    }

    /**
     * 知识库文件列表
     * 查询知识库下所有文件
     * POST，application/json
     *
     * @param repoFileListParam RepoFileListParam
     */
    @PostMapping("/repoFileList")
    public ResponseMsg repoFileList(@RequestBody RepoFileListParam repoFileListParam) {
        return iflytekDocV2Client.repoFileList(repoFileListParam);
    }

    /**
     * 知识库删除
     * 删除知识库
     * POST，application/form-data
     *
     * @param repoId 知识库ID
     */
    @PostMapping("/repoDel")
    public ResponseMsg repoDel(@RequestParam(required = false, value = "repoId") String repoId) {
        return iflytekDocV2Client.repoDel(repoId);
    }

    /**
     * 初始化会话
     *
     * @return sid
     */
    @GetMapping("/chatInit")
    public ResponseMsg chatInit() {
        String sid = iflytekDocV2Client.initChat();
        return ResponseMsg.success(sid, "对话初始化成功");
    }

    /**
     * 验证链接是否有效
     *
     * @param sid
     * @return
     */
    @GetMapping("/checkChatAlive/{sid}")
    public ResponseMsg checkChatAlive(@PathVariable("sid") String sid) {
        return ResponseMsg.success(webSocketServer2.sidAlive(sid), "查询成功");
    }

}
